package com.gaoding.qa.auto.config;

import com.gaoding.qa.auto.data.TestJavaObject;
import com.gaoding.qa.auto.listener.MyListener;
import com.gaoding.qa.auto.properties.GlobalProperties;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

/**
 * 运行时上下文
 *
 * @author mobai
 * @since 2021/10/13 11:03
 */
@Data
public class RuntimeContext {

    /**
     * 本次运行的用例入参
     */
    private TestJavaObject data;


    /**
     * 是否拦截(默认)
     */
    private boolean isIntercept = true;


    /**
     * 运行时头部
     */
    private Map<String, String> runtimeHeaders;


    /**
     * 运行时头部是否长期有效
     */
    private boolean isRuntimeHeadersLastLong;

    /**
     * 自定义状态码是否长期有效
     */
    private boolean isCustomLastLong;


    /**
     * 全局配置
     */
    private GlobalProperties globalProperties;


    /**
     * 当前请求的预期状态码(不写默认是json中配置的状态码)
     */
    private Integer expectStatusCode;

    /**
     * 错误信息
     * 后进先出结构，始终保证获取的是上一次set进去的error信息
     */
    private Stack<ResponseError> error;


    @Data
    public static class ResponseError {

        /**
         * 错误码
         */
        private String code;

        /**
         * 错误信息
         */
        private String message;

        /**
         * 原始堆栈
         */
        private Object error;

    }


    /**
     * 获取动态的头部，是实现一次性和持续性的关键
     */
    public Map<String, String> getDynamicHeaders() {
        Map<String, String> result = new HashMap<>(this.runtimeHeaders.size());
        result.putAll(this.runtimeHeaders);
        if (!this.isRuntimeHeadersLastLong) {
            this.runtimeHeaders.clear();
            this.isRuntimeHeadersLastLong = false;
        }
        return result;

    }

    public int getStatus() {
        if (expectStatusCode == null) {
            return MyListener.getContext().getHttpStatus();
        }
        if (isCustomLastLong) {
            return expectStatusCode;
        }
        int result = expectStatusCode;
        expectStatusCode = null;
        isCustomLastLong = false;
        return result;
    }
}
